/**
    @author: dt
    @date: 2025-06-23
    @description: 任务节点基类
*/
using UnityEngine;

namespace DLib.BehaviorTree
{
    /// <summary>
    /// 任务节点基类
    /// 用于实现具体的游戏逻辑
    /// 任务节点是叶子节点，不包含子节点
    /// </summary>
    public abstract class TaskNode : Node
    {
        /// <summary>任务是否已经开始执行</summary>
        protected bool isStarted = false;

        /// <summary>
        /// 构造函数
        /// 任务节点不包含子节点，所以children列表为空
        /// </summary>
        public TaskNode()
        {
            // children = new List<Node>(); // Task nodes don't have children
        }

        /// <summary>
        /// 评估任务节点
        /// 实现任务节点的生命周期管理：
        /// 1. 首次执行时调用OnStart
        /// 2. 每帧调用OnUpdate
        /// 3. 任务完成时调用OnStop
        /// 4. 检查中断条件
        /// </summary>
        /// <returns>任务执行状态</returns>
        public override NodeState Evaluate()
        {
            // 检查是否被中断
            if (isInterrupted)
            {
                return NodeState.Interrupted;
            }

            // 首次执行时调用开始方法
            if (!isStarted)
            {
                OnStart();
                isStarted = true;
            }

            // 更新任务状态
            state = OnUpdate();

            // 任务完成时调用停止方法
            if (state != NodeState.Running)
            {
                OnStop();
                isStarted = false;
            }

            return state;
        }

        /// <summary>
        /// 任务开始时的回调方法
        /// 子类可以重写此方法来执行初始化逻辑
        /// </summary>
        protected virtual void OnStart() { }
        
        /// <summary>
        /// 任务停止时的回调方法
        /// 子类可以重写此方法来执行清理逻辑
        /// </summary>
        protected virtual void OnStop() { }
        
        /// <summary>
        /// 任务中断时的回调方法
        /// 子类可以重写此方法来执行中断时的清理逻辑
        /// </summary>
        protected virtual void OnInterrupt() { }
        
        /// <summary>
        /// 任务更新方法
        /// 子类必须实现此方法来定义具体的任务逻辑
        /// </summary>
        /// <returns>任务执行状态</returns>
        protected abstract NodeState OnUpdate();

        /// <summary>
        /// 重置任务状态
        /// 将任务重置为未开始状态
        /// </summary>
        public void ResetTask()
        {
            isStarted = false;
            state = NodeState.Failure;
        }

        /// <summary>
        /// 中断任务
        /// </summary>
        public override void Interrupt()
        {
            base.Interrupt();
            OnInterrupt(); // 调用中断回调
        }
    }
} 